package com.wangyf.thread.c_005_volatile_02;

import java.util.ArrayList;
import java.util.List;

/**
 * volatile可以保证线程可见性，但是不能保证原子性，所以不能替代synchronized
 * @author wangyf
 * @date 2021/1/2 15:42
 * 正常来说 应该打印 100000，但是volatile不能保证原子性
 * 可以想象当 线程t1 修改 count 从 0->1 正打算写回内存中的count的时候，
 * t2去读取count，此时count还是为0，t2也进行了count++,
 * ++了两次但是最终结果是1，造成了线程间的不安全，只有run方法加了synchronized才可以
 */
public class T {
    private volatile int count = 0;
    void run () {
        for (int i = 0; i < 10000; i++) count++;
    }

    public static void main(String[] args) {
        T t = new T();
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(t::run));
        }
        threads.forEach(thread -> thread.start());
        threads.forEach(thread -> {
            try {
                thread.join();// 等这10个线程都结束
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(t.count);
    }
}
